package py.una.pol.ii.is2.domain.flota;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

/**
 * Clase que mapea la entidad caracteristica
 * @author mbenitez
 * @date 30/04/2009
 */
@Entity
@Table(name = "caracteristica")
@NamedQueries({@NamedQuery(name = "Caracteristica.findAll", query = "SELECT c FROM Caracteristica c"), @NamedQuery(name = "Caracteristica.findByCaraCod", query = "SELECT c FROM Caracteristica c WHERE c.caraCod = :caraCod"), @NamedQuery(name = "Caracteristica.findByCaraDescripcion", query = "SELECT c FROM Caracteristica c WHERE c.caraDescripcion = :caraDescripcion")})
public class Caracteristica implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="caracteristica_generator")
    @SequenceGenerator(allocationSize=1, name="caracteristica_generator", sequenceName="caracteristica_cara_cod_seq")
    @Basic(optional = false)
    @Column(name = "cara_cod")
    private Integer caraCod;
    @Basic(optional = false)
    @Column(name = "cara_descripcion")
    private String caraDescripcion;
    
    @ManyToMany(mappedBy = "caracteristicaCollection", cascade=CascadeType.MERGE)
    private Collection<Tipo> tipoCollection;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "caracteristica")
    private Collection<VehiculoCaracteristica> vehiculoCaracteristicaCollection;

    /**
     * Constructor por defecto
     */
    public Caracteristica() {
    }

    /**
     * Construye un objeto Caracteristica a partir del parámetro que recibe
     * @param caraCod Código del objeto
     */
    public Caracteristica(Integer caraCod) {
        this.caraCod = caraCod;
    }

    /**
     * Construye un objeto Caracteristica a partir de los parámetros que recibe
     * @param caraCod Código del objeto
     * @param caraDescripcion Descripción del objeto
     */
    public Caracteristica(Integer caraCod, String caraDescripcion) {
        this.caraCod = caraCod;
        this.caraDescripcion = caraDescripcion;
    }

    /**
     * Permite recuperar el código de la caracteristica actual
     * @return código
     */
    public Integer getCaraCod() {
        return caraCod;
    }

    /**
     * Permite asignar código a la caracteristica actual
     * @param caraCod código a asignar
     */
    public void setCaraCod(Integer caraCod) {
        this.caraCod = caraCod;
    }

    /**
     * Permite recuperar la descripción de la carcteristica actual
     * @return descripcion
     */
    public String getCaraDescripcion() {
        return caraDescripcion;
    }

    /**
     * Permite asignar descripción a la caracteristica actual
     * @param caraDescripcion descripción a asignar
     */
    public void setCaraDescripcion(String caraDescripcion) {
        this.caraDescripcion = caraDescripcion;
    }

    public Collection<Tipo> getTipoCollection() {
        return tipoCollection;
    }

    public void setTipoCollection(Collection<Tipo> tipoCollection) {
        this.tipoCollection = tipoCollection;
    }

    public Collection<VehiculoCaracteristica> getVehiculoCaracteristicaCollection() {
        return vehiculoCaracteristicaCollection;
    }

    public void setVehiculoCaracteristicaCollection(Collection<VehiculoCaracteristica> vehiculoCaracteristicaCollection) {
        this.vehiculoCaracteristicaCollection = vehiculoCaracteristicaCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (caraCod != null ? caraCod.hashCode() : 0);
        return hash;
    }

    /**
     * Compara si el elemento recibido como parámetro es igual al elemento actual
     * @param object segundo elemento de comparación
     * @return true si los elementos son iguales, en otro caso false
     */
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Caracteristica)) {
            return false;
        }
        Caracteristica other = (Caracteristica) object;
        if ((this.caraCod == null && other.caraCod != null) || (this.caraCod != null && !this.caraCod.equals(other.caraCod))) {
            return false;
        }
        return true;
    }

    /**
     * Permite mostrar en la salida estándar
     * @return String conteniendo el código de la caracteristica
     */
    @Override
    public String toString() {
        return "py.una.pol.ii.is2.dao.flota.Caracteristica[caraCod=" + caraCod + "]";
    }

}
